Uzziniet, kā izmantot TypeScript kartētos tipus, lai dinamiski transformētu objektu formas, radot robustu un uzturamu kodu globālām lietojumprogrammām.
TypeScript kartētie tipi dinamiskām objektu transformācijām: Visaptverošs ceļvedis
TypeScript, ar savu spēcīgo uzsvaru uz statisko tipēšanu, dod izstrādātājiem iespēju rakstīt uzticamāku un uzturējamāku kodu. Būtiska iezīme, kas to veicina, ir kartētie tipi. Šis ceļvedis iedziļinās TypeScript kartēto tipu pasaulē, sniedzot visaptverošu izpratni par to funkcionalitāti, priekšrocībām un praktisko pielietojumu, īpaši globālu programmatūras risinājumu izstrādes kontekstā.
Pamatkoncepciju izpratne
Būtībā kartētais tips ļauj izveidot jaunu tipu, pamatojoties uz esoša tipa īpašībām. Jūs definējat jaunu tipu, iterējot caur cita tipa atslēgām un piemērojot transformācijas vērtībām. Tas ir neticami noderīgi gadījumos, kad nepieciešams dinamiski mainīt objektu struktūru, piemēram, mainīt īpašību datu tipus, padarīt īpašības neobligātas vai pievienot jaunas īpašības, balstoties uz esošajām.
Sāksim ar pamatiem. Apskatīsim vienkāršu interfeisu:
interface Person {
name: string;
age: number;
email: string;
}
Tagad definēsim kartēto tipu, kas visas Person
īpašības padara par neobligātām:
type OptionalPerson = {
[K in keyof Person]?: Person[K];
};
Šajā piemērā:
[K in keyof Person]
iterē caur katruPerson
interfeisa atslēgu (name
,age
,email
).?
padara katru īpašību par neobligātu.Person[K]
attiecas uz īpašības tipu sākotnējāPerson
interfeisā.
Rezultātā OptionalPerson
tips izskatās šādi:
{
name?: string;
age?: number;
email?: string;
}
Tas demonstrē kartēto tipu spēku dinamiski modificēt esošos tipus.
Kartēto tipu sintakse un struktūra
Kartētā tipa sintakse ir diezgan specifiska un atbilst šai vispārīgajai struktūrai:
type NewType = {
[Key in KeysType]: ValueType;
};
Sadalīsim katru komponentu:
NewType
: Nosaukums, ko piešķirat jaunajam tipam, kas tiek veidots.[Key in KeysType]
: Šis ir kartētā tipa kodols.Key
ir mainīgais, kas iterē caur katruKeysType
elementu.KeysType
bieži, bet ne vienmēr, irkeyof
no cita tipa (kā mūsuOptionalPerson
piemērā). Tas var būt arī virkņu literāļu apvienojums vai sarežģītāks tips.ValueType
: Šis norāda īpašības tipu jaunajā tipā. Tas var būt tiešs tips (piemēram,string
), tips, kas balstīts uz sākotnējā tipa īpašību (piemēram,Person[K]
), vai sarežģītāka sākotnējā tipa transformācija.
Piemērs: Īpašību tipu transformēšana
Iedomājieties, ka jums nepieciešams konvertēt visas objekta skaitliskās īpašības par virknēm. Lūk, kā to var izdarīt, izmantojot kartēto tipu:
interface Product {
id: number;
name: string;
price: number;
quantity: number;
}
type StringifiedProduct = {
[K in keyof Product]: Product[K] extends number ? string : Product[K];
};
Šajā gadījumā mēs:
- Iterējam caur katru
Product
interfeisa atslēgu. - Izmantojam nosacījuma tipu (
Product[K] extends number ? string : Product[K]
), lai pārbaudītu, vai īpašība ir skaitlis. - Ja tas ir skaitlis, mēs iestatām īpašības tipu uz
string
; pretējā gadījumā mēs saglabājam sākotnējo tipu.
Rezultātā StringifiedProduct
tips būtu:
{
id: string;
name: string;
price: string;
quantity: string;
}
Galvenās iezīmes un tehnikas
1. keyof
un indeksa parakstu izmantošana
Kā jau iepriekš demonstrēts, keyof
ir fundamentāls rīks darbam ar kartētiem tipiem. Tas ļauj iterēt caur tipa atslēgām. Indeksa paraksti nodrošina veidu, kā definēt īpašību tipu, ja atslēgas nav zināmas iepriekš, bet jūs tomēr vēlaties tās transformēt.
Piemērs: visu īpašību transformēšana, pamatojoties uz indeksa parakstu
interface StringMap {
[key: string]: number;
}
type StringMapToString = {
[K in keyof StringMap]: string;
};
Šeit visas skaitliskās vērtības StringMap jaunajā tipā tiek konvertētas uz virknēm.
2. Nosacījuma tipi kartētajos tipos
Nosacījuma tipi ir spēcīga TypeScript iezīme, kas ļauj izteikt tipu attiecības, pamatojoties uz nosacījumiem. Kombinējot tos ar kartētiem tipiem, tie ļauj veikt ļoti sarežģītas transformācijas.
Piemērs: Null un Undefined noņemšana no tipa
type NonNullableProperties = {
[K in keyof T]: T[K] extends (null | undefined) ? never : T[K];
};
Šis kartētais tips iterē caur visām tipa T
atslēgām un izmanto nosacījuma tipu, lai pārbaudītu, vai vērtība pieļauj null vai undefined. Ja tā ir, tad tips tiek novērtēts kā 'never', efektīvi noņemot šo īpašību; pretējā gadījumā tas saglabā sākotnējo tipu. Šī pieeja padara tipus robustākus, izslēdzot potenciāli problemātiskas null vai undefined vērtības, uzlabojot koda kvalitāti un saskaņojot to ar labāko praksi globālai programmatūras izstrādei.
3. Palīgtipi efektivitātei
TypeScript nodrošina iebūvētus palīgtipus, kas vienkāršo bieži veicamus tipu manipulācijas uzdevumus. Šie tipi pamatā izmanto kartētos tipus.
Partial
: Padara visas tipaT
īpašības par neobligātām (kā parādīts iepriekšējā piemērā).Required
: Padara visas tipaT
īpašības par obligātām.Readonly
: Padara visas tipaT
īpašības par lasāmām (read-only).Pick
: Izveido jaunu tipu tikai ar norādītajām atslēgām (K
) no tipaT
.Omit
: Izveido jaunu tipu ar visām tipaT
īpašībām, izņemot norādītās atslēgas (K
).
Piemērs: Pick
un Omit
izmantošana
interface User {
id: number;
name: string;
email: string;
role: string;
}
type UserSummary = Pick;
// { id: number; name: string; }
type UserWithoutEmail = Omit;
// { id: number; name: string; role: string; }
Šie palīgtipi ietaupa jūs no atkārtotu kartēto tipu definīciju rakstīšanas un uzlabo koda lasāmību. Tie ir īpaši noderīgi globālā izstrādē, lai pārvaldītu dažādus datu skatus vai piekļuves līmeņus, pamatojoties uz lietotāja atļaujām vai lietojumprogrammas kontekstu.
Reāli pielietojumi un piemēri
1. Datu validācija un transformācija
Kartētie tipi ir nenovērtējami datu validācijai un transformēšanai, kas saņemti no ārējiem avotiem (API, datu bāzes, lietotāja ievade). Tas ir kritiski globālās lietojumprogrammās, kurās var nākties strādāt ar datiem no daudziem dažādiem avotiem un ir jānodrošina datu integritāte. Tie ļauj definēt konkrētus noteikumus, piemēram, datu tipa validāciju, un automātiski modificēt datu struktūras, pamatojoties uz šiem noteikumiem.
Piemērs: API atbildes konvertēšana
interface ApiResponse {
userId: string;
id: string;
title: string;
completed: boolean;
}
type CleanedApiResponse = {
[K in keyof ApiResponse]:
K extends 'userId' | 'id' ? number :
K extends 'title' ? string :
K extends 'completed' ? boolean : any;
};
Šis piemērs transformē userId
un id
īpašības (kas sākotnēji no API ir virknes) par skaitļiem. Īpašība title
tiek pareizi tipēta kā virkne, un completed
tiek saglabāta kā Būla vērtība. Tas nodrošina datu konsekvenci un novērš potenciālas kļūdas turpmākajā apstrādē.
2. Atkārtoti lietojamu komponentu rekvizītu (props) izveide
React un citos UI ietvaros kartētie tipi var vienkāršot atkārtoti lietojamu komponentu rekvizītu izveidi. Tas ir īpaši svarīgi, izstrādājot globālus UI komponentus, kuriem jāpielāgojas dažādām lokalizācijām un lietotāja saskarnēm.
Piemērs: Lokalizācijas apstrāde
interface TextProps {
textId: string;
defaultText: string;
locale: string;
}
type LocalizedTextProps = {
[K in keyof TextProps as `localized-${K}`]: TextProps[K];
};
Šajā kodā jaunais tips LocalizedTextProps
pievieno prefiksu katram TextProps
īpašības nosaukumam. Piemēram, textId
kļūst par localized-textId
, kas ir noderīgi, iestatot komponentu rekvizītus. Šo modeli varētu izmantot, lai ģenerētu rekvizītus, kas ļauj dinamiski mainīt tekstu atkarībā no lietotāja lokalizācijas. Tas ir būtiski, veidojot daudzvalodu lietotāja saskarnes, kas nevainojami darbojas dažādos reģionos un valodās, piemēram, e-komercijas lietojumprogrammās vai starptautiskās sociālo mediju platformās. Transformētie rekvizīti sniedz izstrādātājam lielāku kontroli pār lokalizāciju un spēju radīt konsekventu lietotāja pieredzi visā pasaulē.
3. Dinamiska formu ģenerēšana
Kartētie tipi ir noderīgi, lai dinamiski ģenerētu formu laukus, pamatojoties uz datu modeļiem. Globālās lietojumprogrammās tas var būt noderīgi, veidojot formas, kas pielāgojas dažādām lietotāju lomām vai datu prasībām.
Piemērs: Automātiska formu lauku ģenerēšana, pamatojoties uz objekta atslēgām
interface UserProfile {
firstName: string;
lastName: string;
email: string;
phoneNumber: string;
}
type FormFields = {
[K in keyof UserProfile]: {
label: string;
type: string;
required: boolean;
};
};
Tas ļauj definēt formas struktūru, pamatojoties uz UserProfile
interfeisa īpašībām. Tas novērš nepieciešamību manuāli definēt formas laukus, uzlabojot jūsu lietojumprogrammas elastību un uzturējamību.
Padziļinātas kartēto tipu tehnikas
1. Atslēgu pārsaukšana (Key Remapping)
TypeScript 4.1 ieviesa atslēgu pārsaukšanu kartētajos tipos. Tas ļauj pārdēvēt atslēgas, vienlaikus transformējot tipu. Tas ir īpaši noderīgi, pielāgojot tipus dažādām API prasībām vai ja vēlaties izveidot lietotājam draudzīgākus īpašību nosaukumus.
Piemērs: Īpašību pārdēvēšana
interface Product {
productId: number;
productName: string;
productDescription: string;
price: number;
}
type ProductDto = {
[K in keyof Product as `dto_${K}`]: Product[K];
};
Tas pārdēvē katru Product
tipa īpašību, lai tā sāktos ar dto_
. Tas ir vērtīgi, kartējot starp datu modeļiem un API, kas izmanto atšķirīgu nosaukumu konvenciju. Starptautiskajā programmatūras izstrādē tas ir svarīgi, kur lietojumprogrammas saskaras ar vairākām back-end sistēmām, kurām var būt specifiskas nosaukumu konvencijas, nodrošinot vienmērīgu integrāciju.
2. Nosacījuma atslēgu pārsaukšana
Jūs varat apvienot atslēgu pārsaukšanu ar nosacījuma tipiem sarežģītākām transformācijām, ļaujot pārdēvēt vai izslēgt īpašības, pamatojoties uz noteiktiem kritērijiem. Šī tehnika ļauj veikt sarežģītas transformācijas.
Piemērs: Īpašību izslēgšana no DTO
interface Product {
id: number;
name: string;
description: string;
price: number;
category: string;
isActive: boolean;
}
type ProductDto = {
[K in keyof Product as K extends 'description' | 'isActive' ? never : K]: Product[K]
}
Šeit description
un isActive
īpašības tiek efektīvi noņemtas no ģenerētā ProductDto
tipa, jo atslēga tiek novērtēta kā never
, ja īpašība ir 'description' vai 'isActive'. Tas ļauj izveidot specifiskus datu pārsūtīšanas objektus (DTO), kas satur tikai nepieciešamos datus dažādām operācijām. Šāda selektīva datu pārsūtīšana ir vitāli svarīga optimizācijai un privātumam globālā lietojumprogrammā. Datu pārsūtīšanas ierobežojumi nodrošina, ka tīklos tiek sūtīti tikai relevanti dati, samazinot joslas platuma izmantošanu un uzlabojot lietotāja pieredzi. Tas atbilst globālajiem privātuma noteikumiem.
3. Kartēto tipu izmantošana ar generikiem
Kartētos tipus var apvienot ar generikiem, lai izveidotu ļoti elastīgas un atkārtoti lietojamas tipu definīcijas. Tas ļauj rakstīt kodu, kas var apstrādāt dažādus tipus, ievērojami palielinot jūsu koda atkārtotu lietojamību un uzturējamību, kas ir īpaši vērtīgi lielos projektos un starptautiskās komandās.
Piemērs: Generiska funkcija objektu īpašību transformēšanai
function transformObjectValues(obj: T, transform: (value: T[K]) => U): {
[P in keyof T]: U;
} {
const result: any = {};
for (const key in obj) {
if (obj.hasOwnProperty(key)) {
result[key] = transform(obj[key]);
}
}
return result;
}
interface Order {
id: number;
items: string[];
total: number;
}
const order: Order = {
id: 123,
items: ['apple', 'banana'],
total: 5.99,
};
const stringifiedOrder = transformObjectValues(order, (value) => String(value));
// stringifiedOrder: { id: string; items: string; total: string; }
Šajā piemērā funkcija transformObjectValues
izmanto generikus (T
, K
un U
), lai paņemtu objektu (obj
) ar tipu T
un transformācijas funkciju, kas pieņem vienu īpašību no T un atgriež vērtību ar tipu U. Pēc tam funkcija atgriež jaunu objektu, kas satur tās pašas atslēgas kā sākotnējais objekts, bet ar vērtībām, kas ir transformētas uz tipu U.
Labākā prakse un apsvērumi
1. Tipu drošība un koda uzturējamība
Viena no lielākajām TypeScript un kartēto tipu priekšrocībām ir palielināta tipu drošība. Definējot skaidrus tipus, jūs agrāk pamanāt kļūdas izstrādes laikā, samazinot izpildlaika kļūdu iespējamību. Tie padara jūsu kodu vieglāk saprotamu un refaktorējamu, īpaši lielos projektos. Turklāt kartēto tipu izmantošana nodrošina, ka kods ir mazāk pakļauts kļūdām, programmatūrai mērogojoties un pielāgojoties miljoniem lietotāju vajadzībām visā pasaulē.
2. Lasāmība un koda stils
Lai gan kartētie tipi var būt spēcīgi, ir svarīgi tos rakstīt skaidrā un lasāmā veidā. Izmantojiet jēgpilnus mainīgo nosaukumus un komentējiet savu kodu, lai izskaidrotu sarežģītu transformāciju mērķi. Koda skaidrība nodrošina, ka izstrādātāji ar dažādu pieredzi var lasīt un saprast kodu. Konsekvence stilā, nosaukumu konvencijās un formatēšanā padara kodu pieejamāku un veicina raitāku izstrādes procesu, īpaši starptautiskās komandās, kur dažādi dalībnieki strādā pie dažādām programmatūras daļām.
3. Pārmērīga lietošana un sarežģītība
Izvairieties no pārmērīgas kartēto tipu lietošanas. Lai gan tie ir spēcīgi, tie var padarīt kodu mazāk lasāmu, ja tiek izmantoti pārmērīgi vai ja ir pieejami vienkāršāki risinājumi. Apsveriet, vai piemērotāks risinājums nebūtu tieša interfeisa definīcija vai vienkārša palīgfunkcija. Ja jūsu tipi kļūst pārāk sarežģīti, tos var būt grūti saprast un uzturēt. Vienmēr apsveriet līdzsvaru starp tipu drošību un koda lasāmību. Šī līdzsvara atrašana nodrošina, ka visi starptautiskās komandas locekļi var efektīvi lasīt, saprast un uzturēt koda bāzi.
4. Veiktspēja
Kartētie tipi galvenokārt ietekmē kompilēšanas laika tipu pārbaudi un parasti nerada būtisku izpildlaika veiktspējas slogu. Tomēr pārmērīgi sarežģītas tipu manipulācijas varētu potenciāli palēnināt kompilēšanas procesu. Minimizējiet sarežģītību un apsveriet ietekmi uz būvēšanas laiku, īpaši lielos projektos vai komandām, kas atrodas dažādās laika joslās un ar dažādiem resursu ierobežojumiem.
Noslēgums
TypeScript kartētie tipi piedāvā spēcīgu rīku kopumu, lai dinamiski transformētu objektu formas. Tie ir nenovērtējami, veidojot tipu drošu, uzturējamu un atkārtoti lietojamu kodu, īpaši strādājot ar sarežģītiem datu modeļiem, API mijiedarbību un UI komponentu izstrādi. Apgūstot kartētos tipus, jūs varat rakstīt robustākas un pielāgojamākas lietojumprogrammas, radot labāku programmatūru globālajam tirgum. Starptautiskām komandām un globāliem projektiem kartēto tipu izmantošana piedāvā robustu koda kvalitāti un uzturējamību. Šeit apspriestās funkcijas ir būtiskas, lai veidotu pielāgojamu un mērogojamu programmatūru, uzlabotu koda uzturējamību un radītu labāku pieredzi lietotājiem visā pasaulē. Kartētie tipi atvieglo koda atjaunināšanu, kad tiek pievienotas vai modificētas jaunas funkcijas, API vai datu modeļi.